\chapter{XPath - XML Path Language}
Pomocí XPath\cite{xpathhome} jazyka lze adresovat části XML dokumentu. Tento jazyk obsahuje také základní operace pro manipulaci s řetězci, čísly a logickými hodnotami. Pro zápis výrazů je použita syntaxe, která neobsahuje značkování. Tento způsob zápisu byl zvolen, protože výrazy jazyka XPath jsou určeny také pro použití v rámci URI\footnote{Uniform Resource Identifier - jednotný identifikátor zdroje}.

XPath pracuje s logickou strukturou dokumentu XML (\emph{DOM}) a své pojmenování získal dle své notace podobné notaci URL\footnote{Uniform Resource Locator - jednotný lokátor zdroje, podmožina URI}. Tato notace vyjadřuje cestu v hierarchické struktuře XML dokumentu. Obecný způsob zápisu výrazu ilustruje následující příklad:

\begin{verbatim}
/osa::test-uzlu[predikát]...[predikát]/.../osa::test-uzlu[predikát]
\end{verbatim}

XPath je rovněž součástí dalších jazyků, které vyžadují adresovat nebo vybírat části XML dokumentu. Mezi nejvýznamnější jazyky patří XSLT, XQuery a XPointer.

Primárním syntaktickým konstruktorem XPath jazyka je výraz (\emph{expression}), jehož vyhodnocením lze získat následující čtyři návratové hondoty:
\begin{itemize}
\item množina uzlů
\item logická hodnota
\item číslo
\item řetězec
\end{itemize}

Vyhodnocení každého výrazu probíhá vzhledem ke kontextu, který je možno si představit jako množinu speciálních proměnných, která je k dispozici po celou dobu vyhodnocování výrazu.

\section{Cesty}
 Výraz typu \verb cesta  vyjadřuje lokalizaci uzlů ve stromové struktuře XML dokumentu. Jejím vyhodnocením je množina uzlů splňujících podmínku danou tímto výrazem.  Každá cesta se skládá ze sekvence kroků oddělených znakem  \verb / . Tyto kroky se vyhodnocují zleva doprava a výsledkem každého kroku je množina uzlů. Výsledek každého kroku je daný kontextem kroku předchozího. Vyhodnocení posledního kroku se vyhodnotí dotaz jako celek.

\clearpage
\noindent
XPath jazyk definuje dva typy cest uvedených v tabulce \ref{tab:xpath_cesty}:
\begin{table}[!h]
\begin{center}
\begin{tabular}{|c|l|}
\hline
\textbf{Typ cesty} & \textbf{Popis cesty} \\
\hline
absolutní cesta & Začíná znakem \verb / . Počátečním kontextovým uzlem takové \\
                & cesty je vždy kořenový uzel XML dokumentu. \\
\hline
relativní cesta & Nezačíná znakem \verb / . Počátečním kontextovým uzlem této \\
                & cesty je uzel z kontextu, ve kterém se výraz vyhodnocuje. \\
\hline
\end{tabular}
\caption{Typy XPath cest}
\label{tab:xpath_cesty}
\end{center}
\end{table}

\noindent
V každém kroku se vyhodnocují následující tři části v pořadí daném tabulkou \ref{tab:xpath_vyhodnoceni}:
\begin{table}[!h]
\begin{center}
\begin{tabular}{|c|l|}
\hline
\textbf{Část dotazu k vyhodnocení} & \textbf{Popis dotazu} \\
\hline
osa       & Určuje množinu uzlů, které jsou v určitém vztahu  \\
          & s kontextovým uzlem. \\
\hline
test uzlu & Určuje typ nebo jméno uzlů na dané ose. \\
\hline
predikát  & Představuje podmínku, kterou musí splňovat uzel  \\
          & daného typu nebo jména, který leží na dané ose. \\
\hline
\end{tabular}
\caption{Typy pořadí vyhodnocení cesty XPath dotazu}
\label{tab:xpath_vyhodnoceni}
\end{center}
\end{table}

\section{Osy}
Osy určují množinu uzlů a typ vztahu ke kontextovému uzlu, který platí pro všechny uzly v~této množině.

\noindent
Jazyk XPath definuje celkem třináct typů os popsaných v následující tabulce \ref{tab:xpath_osy}:
\begin{table}[!h]
\begin{center}
\begin{tabular}{|c|l|}
\hline
\textbf{Jméno osy} & \textbf{Popis osy} \\
\hline
child                   & obsahuje přímé potomky kontextového uzlu \\
\hline
descendant              & obsahuje přímé i nepřímé potomky kontextového uzlu \\
\hline
parent                  & obsahuje rodiče kontextového uzlu \\
\hline
ancestor                & obsahuje předka kontextového uzlu \\
\hline
following-sibling       & obsahuje následující sourozence kontextového uzlu \\
\hline
following-descendant    & obsahuje předcházející sourozence kontextového uzlu  \\
\hline
following               & obsahuje všechny uzly, které se v dokumentu nacházejí za \\
                        & kontextovým uzlem (s výjimkou potomků) \\
\hline
preceding               & obsahuje všechny uzly, které se v dokumentu nacházejí \\
                        & před kontextovým uzlem(s výjimkou předků) \\
\hline
attribute               & obsahuje atributy kontextového uzlu \\
\hline
namespace               & všechny uzly reprezentující jmenné prostory dostupné z \\
                        & kontextového uzlu \\
\hline
self                    & obsahuje kontextový uzel \\
\hline
descendant-or-self      & obsahuje sjednocení os descendant a self \\
\hline
ancestor-or-self        & obsahuje sjednocení os ancestor a self \\
\hline
\end{tabular}
\caption{Názvy os jazyka XPath}
\label{tab:xpath_osy}
\end{center}
\end{table}

Každá osa je spojena s určitým typem uzlu. Například osa attribute obsahuje pouze uzly typu atribut, osa namespace obsahuje pouze uzly reprezentující jmenné prostory a ostatní osy obsahují pouze textové uzly, komentáře, instrukce pro zpracování, elementy nebo kořenový uzel.

\noindent
Následující obrázek \ref{fig:xpath_osy} představuje znázornění výše uvedených os (vyjma attribute a namespace, jejichž význam lze pochopit z jejich definice) pro aktuálně zkoumaný uzel, který je vyznačen tučně.
\begin{figure}[!h]
\begin{center}
\includegraphics[width=14cm]{figures/model-axis2.png}
\caption{Grafické znázornění os jazyka XPath.}
\label{fig:xpath_osy}
\end{center}
\end{figure}

\section{Testy uzlu}
V množině získané vyhodnocením osy se dále vyhledávají uzly. Z této množiny se vyberou pouze uzly splňující podmínku testu uzlu. Výčet možností testu uzlu je popsaný v tabulce~\ref{tab:xpath_testy_uzlu}:
\clearpage
\begin{table}[!h]
\begin{center}
\begin{tabular}{|c|l|}
\hline
\textbf{Typ testu uzlu} & \textbf{Popis testu uzlu} \\
\hline
*                                           & vybere všechny elementy, atributy a jmenné  \\
                                            & prostory (\emph{v závislosti na ose}) \\
\hline
prefix:*                                    & vybere všechny elementy nebo atributy ležící ve  \\
                                            & jmennémprostoru určeném daným prefixem \\
\hline
jméno uzlu                                  & vybere všechny elementy nebo atributy s daným  \\
                                            & jménem a nedefinovaným jmenným prostorem \\
\hline
prefix:jméno uzlu                           & vybere všechny elementy nebo atributy s daným  \\
                                            & jménem ležící ve jmenném prostoru určeném \\
                                            & daným prefixem \\
\hline
node()                                      & vybere všechny uzly \\
\hline
text()                                      & vybere všechny textové uzly  \\
\hline
comment()                                   & vybere všechny komentáře \\
\hline
processing-instruction()                    & vybere všechny instrukce pro zpracování \\
\hline
processing-instruction(jméno instrukce)     & vybere instrukce pro zpracování s daným  \\
                                            & jménem \\
\hline
\end{tabular}
\caption{Testy uzlu jazyka XPath}
\label{tab:xpath_testy_uzlu}
\end{center}
\end{table}

\section{Predikáty}
Naposledy se v každém kroku vyhodnocuje predikát. Predikát je libovolný výraz jazyka XPath. Tento výraz se vyhodnocuje postupně pro každý uzel z množiny získané vyhodnocením testu uzlu. Každý uzel z této množiny se použije jako kontextový uzel pro vyhodnocení predikátu.

Pro dopředné osy se kontextová pozice určí jako pořadí uzlu v množině uzlů seřazené ve směru toku v~dokumentu. Pro reverzní osy se kontextová pozice určí jako pořadí uzlu v~množině uzlů seřazené proti směru toku dokumentu. První pozice se vždy označuje číslem 1.

V případě, že výsledek je typu number, vyhodnotí se predikát jako pravdivý pouze tehdy, je-li výsledek roven kontextové pozici. Pro všechny ostatní typy se výsledek převádí na typ boolean.

\section{Zkrácený zápis}
Zápis cesty v úplném tvaru je možné zjednodušit použitím speciálních zkratek:
\begin{itemize}
\item \verb @  se nahradí osou attribute
\item \verb .  se nahradí jako self::node()
\item \verb ..  se nahradí jako parent::node()
\item \verb //  se nahradí jako descendant-or-self::node()
\item při vynechání jména osy se přiřadí osa child
\end{itemize}

\section{Priorita operátorů}
V XPath jazyce je zapotřebí definovat priority (\emph{precedenci}) operátorů. Zavedením těchto priorit je možné operátory ve výrazu kombinovat. Precedence operátorů je uvedená v pořadí s klesajícím významem:
\begin{itemize}
\item \begin{verbatim}(, )\end{verbatim}
\item \begin{verbatim}[, ]\end{verbatim}
\item \begin{verbatim}/, //\end{verbatim}
\item \begin{verbatim}|\end{verbatim}
\item \begin{verbatim}*, div, mod\end{verbatim}
\item \begin{verbatim}+, -\end{verbatim}
\item \begin{verbatim}<, <=, >, >=, !=\end{verbatim}
\item \begin{verbatim}=\end{verbatim}
\item \begin{verbatim}and\end{verbatim}
\item \begin{verbatim}or\end{verbatim}
\end{itemize}


\section{Funkce}
Jazyk XPath přináší řadu funkcí, které ještě více zjednodušují práci s tímto dotazovacím jazykem. Tyto funkce lze využít především ke tvorbě podmínek a výrazů pro výpočty. V~konkrétním prostředí, například XSLT, mohou k funkcím, popsaných v tabulce \ref{tab:xpath_funkce}, být doplněny ještě další funkce. Navíc je možné přidat k výchozím funkcím i vlastní doprogramované rutiny.

\begin{center}
\begin{longtable}{|c|l|l|}
\hline
\textbf{Jméno funkce}     & \textbf{Návratový typ} & \textbf{Popis funkce} \\
\hline
\endfirsthead
\multicolumn{3}{c}%
{{\bfseries \tablename\ \thetable{} -- pokračování z předchozí stránky}} \\
\hline
\textbf{Jméno funkce}     & \textbf{Návratový typ} & \textbf{Popis funkce} \\
\hline
\endhead
\hline
\multicolumn{3}{|r|}{{...pokračování na další stránce}} \\
\hline
\caption[XPath funkce]{XPath funkce} \\
\endfoot
\endlastfoot
id()                      & seznam uzlů            & Vrací uzely se zadaným ID. \\
\hline
position()                & číslo                  & Vrací pozici aktuálního uzlu mezi kontextovými \\
                          &                        & uzly. \\
\hline
last()                    & číslo                  & Vrací pozici posledního uzlu mezi  \\
                          &                        & kontextovými uzly. \\
\hline
count()                   & číslo                  & Vrací počet uzlů v daném seznamu. \\
\hline
local-name()              & řetězec                & Vrací lokální část názvu uzlu (tj. pokud je uzel \\
                          &                        & v určitém jmenném prostoru, vrací se jeho \\
                          &                        & název bez prefixu). \\
\hline
namespace-uri()           & řetězec                & Vrací URI adresu jmenného prostoru, do  \\
                          &                        & kterého patří uzel. \\
\hline
name()                    & řetězec                & Vrací název uzlu. \\
\hline
string()                  & řetězec                & Převede libovolný objekt na řetězec. \\
\hline
concat()                  & řetězec                & Spojí několik řetězců do jednoho. \\
\hline
starts-with()             & boolean                & Otestuje, zda řetězec na svém začátku  \\
                          &                        & obsahuje hledaný řetězec. \\
\hline
contains()                & boolean                 & Otestuje, zda řetězec obsahuje hledaný  \\
                          &                        & řetězec. \\
\hline
substring-before()        & řetězec                & Vrací část řetězec, který se vyskytuje před \\
                          &                        & zadaným řetězcem. \\
\hline
substring-after()         & řetězec                & Vrací část řetězce, která se vyskytuje za  \\
                          &                        & zadaným řetězcem \\
\hline
substring()               & řetězec                & Vrací část řetězce. \\
\hline
string-length()           & číslo                  & Vrací délku (počet znaků) řetězce. \\
\hline
normalize-space()         & řetězec                & Odstraní z řetězce přebytečné mezery. \\
\hline
translate()               & řetězec                & Funkce slouží k jednoduchému překladu  \\
                          &                        & znaků v řetězci. \\
\hline
boolean()                 & boolean                & Převod libovolné hodnoty na logickou  \\
                          &                        & hodnotu. \\
\hline
not()                     & boolean                & Vrací negaci výrazu. \\
\hline
true()                    & boolean                & Funkce vrací hodnotu true. \\
\hline
false()                   & boolean                & Funkce vrací hodnotu false. \\
\hline
lang()                    & boolean                & Funkce zjistí, zda je u aktuálního uzlu  \\
                          &                        & nastaven určitý jazyk pomocí atributu \\
                          &                        & \verb xml:lang \\
\hline
number()                  & číslo                  & Převede libovolný objekt na číselnou  \\
                          &                        & hodnotu. \\
\hline
sum()                     & číslo                  & Funkce vrací součet hodnot uložených  \\
                          &                        & v množině uzlů. \\
\hline
floor()                   & číslo                  & Zaokrouhlení čísla na celé číslo dolů. \\
\hline
ceiling()                 & číslo                  & Zaokrouhlení čísla na celé číslo nahoru. \\
\hline
round()                   & číslo                  & Zaokrouhlení čísla na nejbližší celé číslo. \\
\hline
\caption[XPath funkce]{XPath funkce}
\label{tab:xpath_funkce}
\end{longtable}
\end{center}
